home *** CD-ROM | disk | FTP | other *** search
- /*
- * Standard Dialog Filter
- * 27-Aug-1991
- */
- #include "SCSIAsyncSample.h"
- #include <Scrap.h>
-
- pascal Boolean NumericFilter(
- DialogPtr dp,
- EventRecord *eventPtr,
- short *itemHit
- );
- /*
- * Local
- */
-
- enum {
- kReturnKey = 13,
- kEnterKey = 3,
- kEscapeKey = 27,
- kPushButton = (ctrlItem + btnCtrl)
- };
-
- /*
- * Dialog support routines
- *
- * Replacement for the default ModalDialog procedure. It does everything
- * the default filter does, plus it draws a ring around the OK button.
- * (Original by Mike Kahl).
- *
- * Adapted for SCSIAsyncSample to limit values to integers:
- * kQueryHostBus
- * kQueryTargetID
- * kQueryTotalRequests
- * kQueryBlocksPerTransfer
- * kQueryTimeout
- */
- pascal Boolean
- NumericFilter(
- DialogPtr dp,
- EventRecord *eventPtr,
- short *itemHit
- )
- {
- GrafPtr savePort;
- Boolean isFilteredEvent;
- short defaultItem;
- unsigned char key;
- short itemType;
- Handle itemHandle;
- Rect itemRect;
- PenState savePen;
- short theItem;
- long tempLong; /* For delay */
- #define DIALOG (* ((DialogPeek) dp))
-
- GetPort(&savePort);
- isFilteredEvent = FALSE;
- defaultItem = DIALOG.aDefItem;
- /*
- * Handle standard events
- */
- switch ((*eventPtr).what) {
- case updateEvt:
- if ((WindowPtr) (*eventPtr).message == (WindowPtr) dp) {
- if (defaultItem != 0) {
- GetDItem(
- dp,
- defaultItem,
- &itemType,
- &itemHandle,
- &itemRect
- );
- if ((itemType & ~itemDisable) == kPushButton) {
- SetPort(dp);
- GetPenState(&savePen);
- PenNormal();
- PenSize(3, 3);
- InsetRect(&itemRect, -4, -4);
- FrameRoundRect(&itemRect, 16, 16);
- SetPenState(&savePen);
- SetPort(savePort);
- }
- }
- }
- break;
- case keyDown:
- case autoKey:
- key = (*eventPtr).message & charCodeMask;
- if (key == kReturnKey
- || key == kEnterKey
- || key == kEscapeKey) {
- if (key == kEscapeKey)
- *itemHit = cancel;
- else {
- *itemHit = defaultItem;
- }
- GetDItem(
- dp,
- *itemHit,
- &itemType,
- &itemHandle,
- &itemRect
- );
- if ((itemType & itemDisable) == 0) {
- if (itemType == kPushButton) {
- HiliteControl((ControlHandle) itemHandle, inButton);
- Delay(8, &tempLong);
- HiliteControl((ControlHandle) itemHandle, 0);
- }
- isFilteredEvent = TRUE;
- }
- } /* if return, enter, or escape */
- else if (((*eventPtr).modifiers & cmdKey) != 0
- && (key == 'x' || key == 'c' || key == 'v')) {
- /*
- * Do Cut, Copy, Paste in dialogs.
- */
- *itemHit = DIALOG.editField + 1;
- switch (key) {
- case 'c': /* Dialog copy */
- DlgCopy(dp);
- *itemHit = 0;
- goto fixScrap;
- case 'x': /* Dialog cut */
- DlgCut(dp);
- fixScrap: ZeroScrap();
- TEToScrap();
- break;
- case 'v':
- DlgPaste(dp); /* Umm, this will allow */
- break; /* Pasting garbage! */
- }
- if (*itemHit > 0) {
- GetDItem(
- dp,
- *itemHit,
- &itemType,
- &itemHandle,
- &itemRect
- );
- if ((itemType & itemDisable) == 0)
- isFilteredEvent = TRUE;
- }
- if (isFilteredEvent == FALSE)
- (*eventPtr).what = nullEvent;
- } /* If command key */
- else { /* Not a command key */
- theItem = DIALOG.editField + 1;
- switch (theItem) {
- default:
- break; /* Uninteresting */
- case kQueryHostBus:
- case kQueryTargetID:
- case kQueryTotalRequests:
- case kQueryBlocksPerTransfer:
- case kQueryTimeout:
- /*
- * Permit only 0..9 and delete.
- */
- if (key == '\b') /* Delete */
- ;
- else if (key < '0' || key > '9') {
- noGood: SysBeep(10); /* Bogus */
- isFilteredEvent = TRUE;
- (*eventPtr).what = nullEvent;
- }
- else {
- /* ok */
- }
- break; /* Numeric dialog items */
- } /* Dialog item switch */
- } /* Keystroke handler */
- break;
- }
- return (isFilteredEvent);
- }
-
-